{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import random\n",
    "\n",
    "punctuation = '!()&%{}[];:\\'\",./?\\\\<>'\n",
    "\n",
    "def remove_punc(string):\n",
    "    string = re.sub('[^A-Za-z0-9 ]+', ' ', string)\n",
    "    string = re.sub(r'[ ]+', ' ', string).strip()\n",
    "    return string\n",
    "\n",
    "def remove_punc_random(string, threshold = 0.3):\n",
    "    result = []\n",
    "    for c in string:\n",
    "        if c in punctuation and random.random() >= threshold:\n",
    "            continue\n",
    "            \n",
    "        result.append(c)\n",
    "    return ''.join(result)\n",
    "\n",
    "def add_punc_random(string, threshold = 0.7):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold and string[i][-1] not in punctuation:\n",
    "            string[i] = string[i] + random.choice(punctuation)\n",
    "    return ' '.join(string)\n",
    "\n",
    "def add_space_after_punc(string, threshold = 0.3):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold and string[i][-1] in punctuation:\n",
    "            string[i] = string[i][:-1] + ' ' + string[i][-1]\n",
    "    return ' '.join(string)\n",
    "\n",
    "def replace_random_punc(string):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if string[i][-1] in punctuation:\n",
    "            string[i] = string[i][:-1] + random.choice(punctuation)\n",
    "    return ' '.join(string)\n",
    "\n",
    "def random_upper(string, threshold = 0.5):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold:\n",
    "            string[i] = string[i].upper()\n",
    "    return ' '.join(string)\n",
    "\n",
    "def random_title(string, threshold = 0.5):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold:\n",
    "            string[i] = string[i].title()\n",
    "    return ' '.join(string)\n",
    "\n",
    "def random_char_upper(string, threshold = 0.7):\n",
    "    result = []\n",
    "    for c in string:\n",
    "        if random.random() >= threshold:\n",
    "            c = c.upper()\n",
    "        result.append(c)\n",
    "    return ''.join(result)\n",
    "\n",
    "def remove_space(string, threshold = 0.5):\n",
    "    string = [s for s in string if not (s == ' ' and random.random() >= threshold)]\n",
    "    return ''.join(string)\n",
    "\n",
    "funcs = [remove_punc, remove_punc_random, add_punc_random, add_space_after_punc, \n",
    "         random_upper, random_title, random_char_upper, replace_random_punc]\n",
    "\n",
    "chain_funcs = [remove_punc_random, add_punc_random, add_space_after_punc, \n",
    "         random_upper, random_title, random_char_upper, replace_random_punc]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def package(string, repeat = 2, repeat_chain = 5, threshold = 0.5, maintain_space = False):\n",
    "    \n",
    "    result = [string]\n",
    "    result.append(string.lower())\n",
    "    result.append(string.upper())\n",
    "    result.append(string.title())\n",
    "    \n",
    "    for _ in range(repeat):\n",
    "    \n",
    "        for func in funcs:\n",
    "            result.append(func(string))\n",
    "\n",
    "        for func in funcs:\n",
    "            result.append(func(string.lower()))\n",
    "\n",
    "        for func in funcs:\n",
    "            result.append(func(string.upper()))\n",
    "\n",
    "        for func in funcs:\n",
    "            result.append(func(string.title()))\n",
    "    \n",
    "    for _ in range(repeat_chain):\n",
    "        s = string[:]\n",
    "        for func in chain_funcs:\n",
    "            if random.random() > threshold:\n",
    "                s = func(s)\n",
    "        result.append(s)\n",
    "        \n",
    "    result = list(set(result))\n",
    "    if not maintain_space:\n",
    "        result = [remove_space(r) if random.random() >= 0.6 else r for r in result]\n",
    "        result = list(set(result))\n",
    "        \n",
    "    return [(r, string) for r in result]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('SAYA SUKA MAKAN AYAM DAN DAGING', 'saya suka makan ayam dan daging'),\n",
       " ('sayasuka MakanAyam dan daging', 'saya suka makan ayam dan daging'),\n",
       " ('SAYA SUKA& MAKAN/ AYAM. DAN} DAGING', 'saya suka makan ayam dan daging'),\n",
       " ('SAYASUKA< MAKANAYAM] DANDAGING', 'saya suka makan ayam dan daging'),\n",
       " ('SAYA SUKA MAKAN AYAM DAN Daging', 'saya suka makan ayam dan daging'),\n",
       " ('Saya! Suka makan Ayam dan Daging', 'saya suka makan ayam dan daging'),\n",
       " ('saya Sukamakanayam Dan Daging', 'saya suka makan ayam dan daging'),\n",
       " ('Saya suka maKan ayaM Dan daGing', 'saya suka makan ayam dan daging'),\n",
       " ('Saya Suka MAKaN AYAm Dan DaginG', 'saya suka makan ayam dan daging'),\n",
       " ('SayA SUKA Makan Ayam DAn DAGiNg', 'saya suka makan ayam dan daging'),\n",
       " ('saya suka makan ayam dan daging', 'saya suka makan ayam dan daging'),\n",
       " ('Saya suka MakanAyamdandaging', 'saya suka makan ayam dan daging'),\n",
       " ('saya suka MAKAN AYAM DAN DAGING', 'saya suka makan ayam dan daging'),\n",
       " ('SAya suKamakaN aYam dAndaGInG', 'saya suka makan ayam dan daging'),\n",
       " ('saya SUKAmakanAYAM danDAGING', 'saya suka makan ayam dan daging'),\n",
       " ('saya! suka% makan] ayam] dan daging}', 'saya suka makan ayam dan daging'),\n",
       " ('saya SUKA MAKAN AYAM DAN DAGING', 'saya suka makan ayam dan daging'),\n",
       " ('SAYA Suka Makan AYAM DAN DAGING', 'saya suka makan ayam dan daging'),\n",
       " ('saya suka makan ayam dan> daging', 'saya suka makan ayam dan daging'),\n",
       " ('Saya Suka makan Ayam dan Daging', 'saya suka makan ayam dan daging'),\n",
       " ('sAya sUKa makAN ayAM dAN dagINg', 'saya suka makan ayam dan daging'),\n",
       " ('saya% suka makan ayam: dan} daging', 'saya suka makan ayam dan daging'),\n",
       " ('saya suka makan ayam\\\\ dan daging', 'saya suka makan ayam dan daging'),\n",
       " ('Saya Suka! Makan Ayam Dan Daging', 'saya suka makan ayam dan daging'),\n",
       " (\"Saya< Suka' Makan Ayam Dan Daging;\", 'saya suka makan ayam dan daging'),\n",
       " ('Saya Suka Makan AyamDan Daging', 'saya suka makan ayam dan daging'),\n",
       " ('SayaSukaMakanAyam dan Daging', 'saya suka makan ayam dan daging'),\n",
       " ('sayA SukA makaN Ayam dAn daGing', 'saya suka makan ayam dan daging'),\n",
       " ('saya SUKA makan ayam DAN DAGING', 'saya suka makan ayam dan daging'),\n",
       " ('SAYA SukaMakanAyam Dan Daging', 'saya suka makan ayam dan daging'),\n",
       " ('Saya SUKA MAKAN AYAM DAN Daging', 'saya suka makan ayam dan daging'),\n",
       " ('SAYA suka makan AYAM dan daging', 'saya suka makan ayam dan daging')]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "package('saya suka makan ayam dan daging')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm import tqdm\n",
    "\n",
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        p = package(strings[i])\n",
    "        results.extend(p)\n",
    "    return results\n",
    "\n",
    "def slide(strings, n = 2):\n",
    "    result = []\n",
    "    for i in range(0, len(strings), len(strings) - (n - 1)):\n",
    "        result.append(strings[i: i + n])\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "files = ['/home/husein/pure-text/filtered-dumping-wiki.txt',\n",
    "        '/home/husein/pure-text/dumping-cleaned-news.txt']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "363578"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(files[0]) as fopen:\n",
    "    data = fopen.read().split('\\n')\n",
    "    \n",
    "results, result = [], []\n",
    "for i in data:\n",
    "    if len(i) and i[-1] != '.':\n",
    "        i = i + '.'\n",
    "    if not len(i) and len(result):\n",
    "        results.append(result)\n",
    "        result = []\n",
    "    else:\n",
    "        if len(i):\n",
    "            result.append(i)\n",
    "        \n",
    "if len(result):\n",
    "    results.append(result)\n",
    "    \n",
    "len(results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm import tqdm\n",
    "\n",
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        try:\n",
    "            slided = slide(strings[i])\n",
    "            slided = [s for s in slided if len(s) > 1]\n",
    "            for s in slided:\n",
    "                s = ' '.join(s)\n",
    "                p = package(s)\n",
    "                results.extend(p)\n",
    "        except:\n",
    "            pass\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 94%|█████████▍| 4124/4375 [00:05<00:00, 792.72it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 790.97it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 760.16it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 756.20it/s]\n",
      " 98%|█████████▊| 4295/4375 [00:05<00:00, 853.56it/s]\n",
      " 99%|█████████▉| 4334/4375 [00:05<00:00, 906.80it/s]\n",
      " 95%|█████████▍| 4143/4375 [00:05<00:00, 783.28it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 762.32it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 770.92it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 724.72it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 721.45it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 746.25it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 706.22it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 749.44it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 732.38it/s]\n",
      "100%|██████████| 4375/4375 [00:05<00:00, 735.83it/s]\n"
     ]
    }
   ],
   "source": [
    "import cleaning\n",
    "\n",
    "results1 = cleaning.multiprocessing(random.sample(results, 70000), loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([(\"Saint-Broing-Les-Moines . Saint-Broing-Les-Moines Ialah Komun Di Jabatan Cote-D'Or Di Timur Perancis .\",\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  (\"SAINT-BROING-LES-MOINES. SAINT-BROING-LES-MOINESIALAHKOMUN,DI JABATAN&COTE-D'OR DITIMUR' PERANCIS.\",\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  ('saint-broing-les-moines saint-broing-les-moines ialah komun di jabatan cote-dor di timur perancis',\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  (\"Saint-Broing-Les-Moines.saint-broing-les-moines Ialahkomundi Jabatan cote-d'orDi TimurPerancis.\",\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  ('SAINT-BROING-LES-MOINES SAINT-BROING-LES-MOINES IALAH KOMUN DI JABATAN COTE-DOR DI TIMUR PERANCIS.',\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  (\"SAINT-BROING-LES-MOINES. SAINT-BROING-LES-MOINES IALAH Komun DI Jabatan Cote-D'Or DI TIMUR PERANCIS.\",\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  ('Saint-Broing-les-Moines>Saint-Broing-les-Moinesialah komun dijabatanCote-d\\'Ordi timur Perancis\"',\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  ('saint-broing-les-moines: saint-broing-les-moines ialah komun di jabatan cote-d\\'or di timur perancis\"',\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  ('Saint BroinglesMoinesSaint Broing les Moines ialahkomundijabatan CotedOrditimurPerancis',\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\"),\n",
       "  (\"Saint-Broing-les-Moines. Saint-Broing-les-Moinesialah komundi% jabatanCote-d'Or ditimur Perancis.\",\n",
       "   \"Saint-Broing-les-Moines. Saint-Broing-les-Moines ialah komun di jabatan Cote-d'Or di timur Perancis.\")],\n",
       " 2584138)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results1[:10], len(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cleaning_row(string):\n",
    "    string = string.replace('\\n', ' ').replace('\\t', ' ')\n",
    "    string = re.sub(r'[ ]+', ' ', string).strip()\n",
    "    return string"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 2584138/2584138 [01:13<00:00, 35009.00it/s]\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "with tf.io.gfile.GFile('true-case-multisentences-wiki.tsv', \"w\") as outfile:\n",
    "    for i in tqdm(range(len(results1))):\n",
    "        l = cleaning_row(results1[i][0])\n",
    "        r = cleaning_row(results1[i][1])\n",
    "        outfile.write(\"%s\\t%s\\n\" % (l, r))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3656919"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(files[1]) as fopen:\n",
    "    data = fopen.read().split('\\n')\n",
    "    \n",
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "results, result = [], []\n",
    "for i in data:\n",
    "    if len(i) and i[-1] != '.':\n",
    "        i = i + '.'\n",
    "    if not len(i) and len(result):\n",
    "        results.append(result)\n",
    "        result = []\n",
    "    else:\n",
    "        if len(i):\n",
    "            result.append(i)\n",
    "        \n",
    "if len(result):\n",
    "    results.append(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1875/1875 [00:04<00:00, 403.89it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 408.04it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 385.80it/s]\n",
      "100%|██████████| 1875/1875 [00:05<00:00, 370.15it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 393.01it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 408.61it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 408.48it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 407.65it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 378.81it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 394.50it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 396.54it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 391.33it/s]\n",
      "100%|██████████| 1875/1875 [00:05<00:00, 369.01it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 390.46it/s]\n",
      "100%|██████████| 1875/1875 [00:05<00:00, 355.89it/s]\n",
      "100%|██████████| 1875/1875 [00:04<00:00, 376.53it/s]\n"
     ]
    }
   ],
   "source": [
    "results = random.sample(results, 30000)\n",
    "results1 = cleaning.multiprocessing(results, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1798495/1798495 [00:58<00:00, 30947.92it/s]\n"
     ]
    }
   ],
   "source": [
    "with tf.io.gfile.GFile('true-case-multisentences-news.tsv', \"w\") as outfile:\n",
    "    for i in tqdm(range(len(results1))):\n",
    "        l = cleaning_row(results1[i][0])\n",
    "        r = cleaning_row(results1[i][1])\n",
    "        outfile.write(\"%s\\t%s\\n\" % (l, r))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_short(string):\n",
    "    splitted = string.split()\n",
    "    random_length = random.randint(2, min(len(splitted), 20))\n",
    "    end = random.randint(0 + random_length, len(splitted))\n",
    "    return ' '.join(splitted[end - random_length: end])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2037249"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(files[0]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = [i for i in data if len(i) >= 2]\n",
    "\n",
    "len(data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('\"Klaas-Jan\" Huntelaar (Lahir 12 Ogos 1983) Merupakan Pemain Bola Sepak Belanda Yang Bermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('KLAAS JANHUNTELAARLAHIR12 OGOS1983 MERUPAKANPEMAINBOLA SEPAK BELANDAYANGBERMAINDIPOSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" HUNTELAAR (LAHIR 12 OGOS 1983) MERUPAKAN Pemain BOLA SEPAK BELANDA YANG BERMAIN Di POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('Klaas Jan Huntelaar Lahir 12 Ogos 1983 Merupakan Pemain Bola Sepak Belanda Yang Bermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\" huntelaar (lahir 12 ogos 1983) merupakan pemain bola sepak belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan) Huntelaar(Lahir 12Ogos1983]Merupakan PemainBolaSepak Belanda Yang BermainDi Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar(Lahir> 12{ Ogos1983)Merupakan}Pemain Bola[ Sepak Belanda Yang Bermain;Di, Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan \" huntelaar (lahir 12 ogos 1983 ) merupakan pemain bola sepak belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\" HUNTELAAR (LAHIR 12 ogos 1983) merupakan pemain bola sepak BELANDA yang bermain DI posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAas-JaN\" HUntelaaR (Lahir 12 OgoS 1983) MerupAkaN PemaIn BOla Sepak Belanda YANg BerMaIN Di PosIsi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('KLAAS-JANHUNTELAAR LAHIR 12OGOS 1983 MERUPAKAN PEMAIN BOLA SEPAK BELANDAYANGBERMAINDI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\"Huntelaar (Lahir 12 Ogos 1983)merupakanPemain Bola Sepak Belandayang BermainDiposisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\" Huntelaar (lahir 12 Ogos 1983) Merupakan pemain bola sepak Belanda yang Bermain di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan \" huntelaar (lahir 12 ogos 1983) merupakan pemain bola sepak belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('KLAAS-JAN HUNTELAAR(LAHIR12OGOS1983MERUPAKAN PEMAIN BOLASEPAK BELANDA YANGBERMAINDI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('KlaasJan Huntelaar lahir 12Ogos 1983 merupakan pemainbola sepakBelanda yangbermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar (lahir 12>Ogos1983) merupakan<pemain{ bola(sepakBelandayangbermain< diposisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" HuntelaaR (lAHIr 12 Ogos 1983) merUPakan Pemain bola sePAk BElanda yaNg bErMaIn DI posIsi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan Huntelaar lahir 12 Ogos 1983 merupakan pemain bola sepak Belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan: Huntelaar (lahir 12 Ogos 1983, merupakan pemain bola sepak Belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\"Huntelaar(LAHIR12 Ogos1983) MERUPAKAN PEMAINBola SepakBELANDAYANGBermain DIPOSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('klaas janhuntelaar lahir 12ogos1983 merupakan pemain bola sepak belanda yang bermain diposisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" HUNTELAAR (Lahir 12 OGOS 1983) Merupakan Pemain BOLA Sepak Belanda YANG BERMAIN DI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN\" HUNTELAAR (LAHIR 12> OGOS 1983) MERUPAKAN PEMAIN BOLA SEPAK\\\\ BELANDA YANG BERMAIN DI{ POSISI\"',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan < Huntelaar (lahir 12 < Ogos 1983 ; merupakan pemain & bola) sepak Belanda yang \\' bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN, HUNTELAAR (LAHIR 12 OGOS 1983< MERUPAKAN PEMAIN BOLA SEPAK BELANDA YANG BERMAIN DI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan}Huntelaar(Lahir! 12%Ogos1983] Merupakan PEMAINBolasepakBELANDA Yang]BERMAIN Di POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\"Huntelaar(Lahir12 ogos1983) Merupakan Pemain Bola sepakBelanda Yang bermain Diposisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLaAs-JAn\" HUntElaar (lahIr 12 OGOs 1983) meRUpakaN pemAin boLa sepaK BelANDa YANg bermAin Di posIsi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar (lahir12 Ogos1983)merupakan pemain bolasepak Belandayang bermaindi posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\"Huntelaar(lahir12Ogos1983)merupakan pemain bolasepakBelandayang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN\" HUntELaAr (LAHIR 12 OGOS 1983) MerUpaKAn Pemain BOLA SePAk BElaNDa Yang BERMAIN Di posiSI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('Klaas-Jan\" Huntelaar (Lahir 12 Ogos 1983 Merupakan Pemain Bola Sepak Belanda Yang Bermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('Klaas-Jan Huntelaar Lahir 12 Ogos 1983) Merupakan Pemain Bola Sepak Belanda Yang Bermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaAS-jan\" hUNtElaAR (lahir 12 Ogos 1983) MEruPAkAn PEmaIn boLA SEpaK BeLAnda yaNg bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar (Lahir 12 Ogos 1983) Merupakan Pemain bola Sepak Belanda Yang bermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar(lahir12> Ogos{ 1983) merupakan! pemainbola sepakBelanda[yang> bermaindi/ posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar (Lahir 12 Ogos} 1983) Merupakan Pemain Bola Sepak Belanda Yang Bermain{ Di Posisi?',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN\" HUNTELAAR} (LAHIR12[OGOS1983) MERUPAKANPEMAIN BOLA?SEPAK BELANDA YANGBERMAINDI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan: Huntelaar (Lahir12 Ogos 1983:Merupakan PemainBolaSepakBelandaYangBermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('klaas-jan huntelaar lahir 12 ogos 1983) merupakan pemain bola sepak belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\" huntelaar (lahir 12 ogos 1983) merupakan pemain\\\\ bola sepak\" belanda yang bermain di< posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" HUNTELAAR (lahir 12 OGOS 1983) MERUPAKAN PEMAIN bola SEPAK BELANDA YANG bermain di POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\" huntelaar (lahir) 12 ogos 1983) merupakan[ pemain bola sepak: belanda] yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAas-Jan\" HuNtelaaR (LAhir 12 OGos 1983) MeRUpAkAN PEMaIn BOLA SepaK BeLanDA Yang Bermain DI PosisI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('klaas-jan\" huntelaar lahir 12 ogos 1983 merupakan pemain bola sepak belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar (Lahir 12 OGOS 1983) MERUPAKAN Pemain BOLA Sepak BELANDA Yang BERMAIN DI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan Huntelaar LAHIR12Ogos1983 MERUPAKANpemain bola sepakBelandayangBERMAINDIposisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan\" Huntelaar (lahir 12 OGOS 1983) MERUPAKAN Pemain Bola SEPAK BELANDA YANG Bermain Di Posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\\' huntelaar (lahir 12 ogos 1983> merupakan pemain bola sepak belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KlaAs-JaN\" hunteLAar (LAhiR 12 ogos 1983) MeRupAKan PemAIn bolA sepaK belANdA yanG bermain Di pOsisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN% HUNTELAAR (LAHIR 12 OGOS1983< MERUPAKANPEMAINBOLA SEPAK BELANDAYANGBERMAIN DIPOSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN\" HUNTELAAR (LAHIR 12 Ogos 1983) MERUPAKAN PEMAIN BOLA sepak BELANDA YANG BERMAIN di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan\" HUNTELAAR (LAHIR 12 ogos 1983) MERUPAKAN pemain bola SEPAK BELANDA YANG BERMAIN di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('Klaas-Jan Huntelaar lahir12Ogos 1983 merupakan pemain bola sepakBelandayangbermaindi posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN\" HUNTELAAR (LAHIR12OGOS1983 )MERUPAKANPEMAIN BOLASEPAKBELANDA YANG BERMAINDIPOSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"Klaas-Jan/ Huntelaar (lahir 12 Ogos 1983! merupakan pemain bola sepak Belanda yang bermain di posisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"KLAAS-JAN\" HUNTELAAR (LAHIR 12 OGOS 1983) MERUPAKAN PEMAIN BOLA SEPAK BELANDA YANG BERMAIN DI POSISI',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi'),\n",
       " ('\"klaas-jan(huntelaar (lahir12ogos 1983\\\\ merupakanpemain bolasepakbelandayangbermaindiposisi',\n",
       "  '\"Klaas-Jan\" Huntelaar (lahir 12 Ogos 1983) merupakan pemain bola sepak Belanda yang bermain di posisi')]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "package(generate_short(data[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = random.sample(data, 200000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        try:\n",
    "            p = package(generate_short(strings[i]))\n",
    "            results.extend(p)\n",
    "        except:\n",
    "            pass\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 12500/12500 [00:09<00:00, 1296.80it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1268.32it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1271.07it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1278.68it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1261.42it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1268.90it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1263.46it/s]\n",
      "100%|██████████| 12500/12500 [00:09<00:00, 1258.26it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1248.70it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1224.54it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1222.27it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1221.50it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1205.80it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1206.38it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1197.89it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1180.26it/s]\n"
     ]
    }
   ],
   "source": [
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([('Mengadakan[ Pemilihan', 'mengadakan Pemilihan'),\n",
       "  ('MENGADAKANPEmiLihAn', 'mengadakan Pemilihan'),\n",
       "  ('MENGADAKANPEmIlihan', 'mengadakan Pemilihan'),\n",
       "  ('mengadakan Pemilihan', 'mengadakan Pemilihan'),\n",
       "  ('MENGADAKAN PEMILIHAN', 'mengadakan Pemilihan'),\n",
       "  ('MengadakaN PemilIhaN', 'mengadakan Pemilihan'),\n",
       "  ('mengadakan% Pemilihan', 'mengadakan Pemilihan'),\n",
       "  ('MeNGADaKAn PeMiLihaN', 'mengadakan Pemilihan'),\n",
       "  ('mengADakaN peMIlihaN', 'mengadakan Pemilihan'),\n",
       "  ('MeNgaDAkAN pemIlIhAn', 'mengadakan Pemilihan')],\n",
       " 8083198)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results1[:10], len(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 8083198/8083198 [01:55<00:00, 69714.75it/s]\n"
     ]
    }
   ],
   "source": [
    "with tf.io.gfile.GFile('true-case-short-wiki.tsv', \"w\") as outfile:\n",
    "    for i in tqdm(range(len(results1))):\n",
    "        l = cleaning_row(results1[i][0])\n",
    "        r = cleaning_row(results1[i][1])\n",
    "        outfile.write(\"%s\\t%s\\n\" % (l, r))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(files[1]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = random.sample(data, 200000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 12500/12500 [00:10<00:00, 1225.42it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1233.36it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1227.01it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1219.79it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1219.64it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1204.49it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1214.88it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1194.62it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1188.04it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1186.63it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1188.94it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1186.01it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1169.45it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1169.36it/s]\n",
      "100%|██████████| 12500/12500 [00:10<00:00, 1161.64it/s]\n",
      " 99%|█████████▉| 12427/12500 [00:11<00:00, 1301.21it/s]\n",
      "100%|██████████| 12500/12500 [00:11<00:00, 1117.72it/s]"
     ]
    }
   ],
   "source": [
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8075957"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 8075957/8075957 [01:59<00:00, 67302.78it/s]\n"
     ]
    }
   ],
   "source": [
    "with tf.io.gfile.GFile('true-case-short-news.tsv', \"w\") as outfile:\n",
    "    for i in tqdm(range(len(results1))):\n",
    "        l = cleaning_row(results1[i][0])\n",
    "        r = cleaning_row(results1[i][1])\n",
    "        outfile.write(\"%s\\t%s\\n\" % (l, r))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(files[0]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = [i for i in data if len(i) >= 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        p = package(strings[i])\n",
    "        results.extend(p)\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 4375/4375 [00:06<00:00, 701.37it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 703.23it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 685.55it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 697.34it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 657.95it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 656.78it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 670.20it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 658.90it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 673.16it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 648.82it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 642.41it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 655.86it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 628.27it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 643.76it/s]\n",
      "100%|██████████| 4375/4375 [00:06<00:00, 641.13it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 614.44it/s]\n"
     ]
    }
   ],
   "source": [
    "data = random.sample(data, 70000)\n",
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 3752297/3752297 [01:18<00:00, 47658.98it/s]\n"
     ]
    }
   ],
   "source": [
    "with tf.io.gfile.GFile('true-case-wiki.tsv', \"w\") as outfile:\n",
    "    for i in tqdm(range(len(results1))):\n",
    "        l = cleaning_row(results1[i][0])\n",
    "        r = cleaning_row(results1[i][1])\n",
    "        outfile.write(\"%s\\t%s\\n\" % (l, r))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 4375/4375 [00:07<00:00, 602.73it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 588.61it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 585.87it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 583.82it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 578.28it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 566.07it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 560.36it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 561.83it/s]\n",
      "100%|██████████| 4375/4375 [00:07<00:00, 549.89it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 544.98it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 544.07it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 544.38it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 544.64it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 538.31it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 534.94it/s]\n",
      "100%|██████████| 4375/4375 [00:08<00:00, 537.18it/s]\n"
     ]
    }
   ],
   "source": [
    "with open(files[1]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = random.sample(data, 70000)\n",
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 3828676/3828676 [01:31<00:00, 41663.44it/s]\n"
     ]
    }
   ],
   "source": [
    "with tf.io.gfile.GFile('true-case-news.tsv', \"w\") as outfile:\n",
    "    for i in tqdm(range(len(results1))):\n",
    "        l = cleaning_row(results1[i][0])\n",
    "        r = cleaning_row(results1[i][1])\n",
    "        outfile.write(\"%s\\t%s\\n\" % (l, r))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'mesolitica-tpu.json'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "from google.cloud import storage\n",
    "\n",
    "client = storage.Client()\n",
    "bucket = client.bucket('mesolitica-tpu-general')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['true-case-multisentences-wiki.tsv',\n",
       " 'true-case-news.tsv',\n",
       " 'true-case-short-wiki.tsv',\n",
       " 'true-case-wiki.tsv',\n",
       " 'true-case-short-news.tsv',\n",
       " 'true-case-multisentences-news.tsv']"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from glob import glob\n",
    "\n",
    "files = glob('true-case*.tsv')\n",
    "files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true-case-multisentences-wiki.tsv\n",
      "true-case-news.tsv\n",
      "true-case-short-wiki.tsv\n",
      "true-case-wiki.tsv\n",
      "true-case-short-news.tsv\n",
      "true-case-multisentences-news.tsv\n"
     ]
    }
   ],
   "source": [
    "for file in files:\n",
    "    print(file)\n",
    "    blob = bucket.blob(f't5-data-v2/{file}')\n",
    "    blob.upload_from_filename(file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "b2_application_key_id = os.environ['b2_application_key_id']\n",
    "b2_application_key = os.environ['b2_application_key']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from b2sdk.v1 import *\n",
    "info = InMemoryAccountInfo()\n",
    "b2_api = B2Api(info)\n",
    "application_key_id = b2_application_key_id\n",
    "application_key = b2_application_key\n",
    "b2_api.authorize_account(\"production\", application_key_id, application_key)\n",
    "file_info = {'how': 'good-file'}\n",
    "b2_bucket = b2_api.get_bucket_by_name('malay-dataset')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true-case-multisentences-wiki.tsv\n",
      "true-case-news.tsv\n",
      "true-case-short-wiki.tsv\n",
      "true-case-wiki.tsv\n",
      "true-case-short-news.tsv\n",
      "true-case-multisentences-news.tsv\n"
     ]
    }
   ],
   "source": [
    "for file in files:\n",
    "    print(file)\n",
    "    b2_bucket.upload_local_file(\n",
    "    local_file=file,\n",
    "    file_name=f'true-case/{file}',\n",
    "    file_infos=file_info,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "for file in files:\n",
    "    os.remove(file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "import tensorflow_datasets as tfds\n",
    "from t5.data import preprocessors as prep\n",
    "import functools\n",
    "import t5\n",
    "import gin\n",
    "import sentencepiece as spm\n",
    "from glob import glob\n",
    "import os\n",
    "\n",
    "gin.parse_config_file('pretrained_models_base_operative_config.gin')\n",
    "vocab = 'sp10m.cased.ms-en.model'\n",
    "sp = spm.SentencePieceProcessor()\n",
    "sp.Load(vocab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "def segmentation_dataset(split, shuffle_files = False):\n",
    "    del shuffle_files\n",
    "    ds = tf.data.TextLineDataset(\n",
    "        [\n",
    "            'gs://mesolitica-tpu-general/t5-data-v2/true-case-short-wiki.tsv'\n",
    "        ]\n",
    "    )\n",
    "\n",
    "    ds = ds.map(\n",
    "        functools.partial(\n",
    "            tf.io.decode_csv,\n",
    "            record_defaults = ['', ''],\n",
    "            field_delim = '\\t',\n",
    "            use_quote_delim = False,\n",
    "        ),\n",
    "        num_parallel_calls = tf.data.experimental.AUTOTUNE,\n",
    "    )\n",
    "    ds = ds.map(lambda *ex: dict(zip(['question', 'answer'], ex)))\n",
    "    return ds\n",
    "\n",
    "def segmentation_preprocessor(ds):\n",
    "    def to_inputs_and_targets(ex):\n",
    "        return {\n",
    "            'inputs': tf.strings.join(['kes benar: ', ex['question']]),\n",
    "            'targets': ex['answer'],\n",
    "        }\n",
    "\n",
    "    return ds.map(\n",
    "        to_inputs_and_targets,\n",
    "        num_parallel_calls = tf.data.experimental.AUTOTUNE,\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "t5.data.TaskRegistry.remove('segmentation_dataset')\n",
    "t5.data.TaskRegistry.add(\n",
    "    'segmentation_dataset',\n",
    "    dataset_fn = segmentation_dataset,\n",
    "    splits = ['train'],\n",
    "    text_preprocessor = [segmentation_preprocessor],\n",
    "    sentencepiece_model_path = vocab,\n",
    "    metric_fns = [t5.evaluation.metrics.accuracy],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "nq_task = t5.data.TaskRegistry.get(\"segmentation_dataset\")\n",
    "ds = nq_task.get_dataset(split='knowledge-graph.tsv', sequence_length={\"inputs\": 256, \"targets\": 256})\n",
    "r = tfds.as_numpy(ds)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'inputs_plaintext': b'kes benar: Baru Padang Serai merupakan sebuah kampung YANG terletak DALAM Mukim NAGA LILIT, DAERAH',\n",
       " 'inputs': array([  744,   679,    31,  2128,  7353, 26241,   157,   136,  1350,\n",
       "         4897,   282, 11031,  9937,   517, 21337,   876,  4510,  5094,\n",
       "           14,    13,  4541,  4056,  5168,     1]),\n",
       " 'targets_plaintext': b'Baru Padang Serai merupakan sebuah kampung yang terletak dalam Mukim Naga Lilit, Daerah',\n",
       " 'targets': array([ 2128,  7353, 26241,   157,   136,  1350,    17,   282,    36,\n",
       "         9937, 17366,  2015,  3813,    14,  2684,     1])}"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "next(r)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
